https://mp.weixin.qq.com/s/MFnYHN0Ed0iZjRG7AwpgKw

1.意外的全局变量：由于使用未声明的变量，而意外的创建了一个全局变量，而使这个变量一直留在内存中无法被回收。

2.被遗忘的计时器或回调函数：设置了 setInterval 定时器，而忘记取消它，
如果循环函数有对外部变量的引用的话，那么这个变量会被一直留在内存中，而无法被回收。

3.脱离 DOM 的引用：获取一个 DOM 元素的引用，而后面这个元素被删除，由于一直保留了对这个元素的引用，所以它也无法被回收。

4.闭包：不合理的使用闭包，从而导致某些变量一直被留在内存当中。

5.未解绑的事件监听器:
如果你给DOM元素添加了事件监听器，但没有在适当的时候移除，那么这就可能导致内存泄漏。

var button = document.getElementById('myButton');
button.addEventListener('click', function(event) {
  // 处理点击事件
});

在上述代码中，如果元素 myButton 被删除或替换，但是点击事件的监听器没有被正确移除，那么监听器仍然存在于内存中，导致内存泄漏。

解决方法：在元素被删除或不再需要的时候，使用 removeEventListener 将事件监听器移除。

6.永不结束的循环：
如果你的代码中有一个永不结束的循环，那么就会持续地消耗内存。

function createObjects() {
  var obj1 = {};
  var obj2 = {};

  obj1.ref = obj2;
  obj2.ref = obj1;
}

createObjects();
在上述代码中，obj1 和 obj2 彼此引用，创建了一个循环引用的情况。即使这些对象超出了函数的作用域，它们仍然无法被垃圾回收器回收。

解决方法：在不再需要引用的时候手动解除对象之间的循环引用。


7.未使用的对象和数组的属性：
如果你的代码中存在未使用的对象或数组属性，这些属性将不会被垃圾回收，从而可能导致内存泄漏。